perm filename TBOX1.FAI[CMS,LCS] blob sn#349384 filedate 1978-04-19 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00005 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002		TITLE TBOX
C00005 00003	INPUT WAIT
C00007 00004	 Byte input routine
C00009 00005	 Bit spreading table
C00011 ENDMK
C⊗;
	TITLE TBOX
	.INSERT MAC748.FAI[CMS,LCS]

	CMD ← 1 ↔ N ← 2	↔ T ← 3 ↔ K ← 0
	SW0 ← 4	↔ SW1 ← 5 ↔ SW2 ← 6 ↔ AD ← 7

	XTAL ← =5000000
	BRATE ← =9600	;Baud rate

	TBIT ← ((=10000000/BRATE)/((=10000000/XTAL)*=15))/2

	ROW0 ← 357 ↔ ROW1 ← 337
	SBITS ← 60

		JMP	RST	;RESET VECTOR
		0
		DISXI		;EXTERNAL INTERRUPT VECTOR
		NOP
		NOP
		NOP
		DISTI		;TIMER INT VECTOR
		RETR

	RST:	MOVI	377	;SETUP INPUT PORTS
		OUTB
		OUTP	1
		OUTP	2

		CALL	CLED	;Clear leds
		CLRA		;Zero A for input byte
		MOVAT		;Setup timer
		STRTT
		JMP	SETFLG

; Set scan flag and timer
	UPFLG:	DJNZ	T,CKIN
	SETFLG:	MOVRI	T,4	;4 = 96 ms
		CLRF0		;Set scan flag
;INPUT WAIT
   OFFSET ← TBIT/2
	INWAI:	JTF	UPFLG	;CHECK IF TIMER TIME OUT

	CKIN:	JT0H	INWAI	;CHECK FOR START BIT

		MOVRI	N,OFFSET-4
	CENTER:	DJNZ	N,CENTER	;Wait for center of bit
		JT0H	INWAI		;Check if valid start bit

		MOVRI	CMD,11	;# of bits -1
	ILOOP:	CALL	IWAI
		DJNZ	CMD,ILOOP

		ROLC		;Shift out stop bit
		JCC	GAD	;Check for good stop bit.

		MOVAR	CMD	;Save led command
		CALL	CLED	;Clear leds

		JF0S	OSWTCH	;Check if time to scan.
		JMP	SCAN
; Output switches
	OSWTCH:	MOVRA	SW0
		CALL	OBYTE
		MOVRA	SW1
		CALL	OBYTE
		MOVRA	SW2
		CALL	OBYTE

		CLRA
		JT1H	ADZRO	;↑BUS←377
		INB		;t¬WR¬RD ≥ ICYC*40
		CPLA		;Get true bits
		JNZ	ADZRO
		INCA		;Force AD non zero
	ADZRO:	CALL	OBYTE

		MOVRA	CMD	;Write leds
		RORC		;Get cal led
		ANI	7
		JZ	GAD+1
		OUTB		;Mode led (1-7)
	GAD:	CLRA
		JCC	INWAI
		OUTB		;Write cal led
		JMP	INWAI
; Byte input routine
	IWAI:	MOVRI	N,TBIT-6
	WAI:	DJNZ	N,WAI
		CLRC
		JT0H	BITON
		NOP
		RORC
		RET

	BITON:	CPLC
		RORC
		RET

;Clear leds
	CLED:	MOVI	370
	CLRL:	OUTB		;Clear led loop
		INCA
		JNZ	CLRL
		RET		;Return with BUS ← 377

; Output Acc. to SI/O line
	OBYTE:	MOVRI	K,11	;# of bits -1
		CLRC
		ROLC		;Start bit
	OLOOP:	OUTP	1	;Output bit
		RORC
		MOVRI	N,TBIT-3

	OWAIT:	DJNZ	N,OWAIT
		DJNZ	K,OLOOP
		
		ORPI	1,377	;Stop bit

		MOVRI	N,TBIT-7
	SWAIT:	DJNZ	N,SWAIT
		NOP
		RET
; Bit spreading table
	LOC 674		;674 = Start of page one
		  0 ↔   1 ↔   4 ↔   5 ↔  20 ↔  21 ↔  24 ↔  25
		100 ↔ 101 ↔ 104 ↔ 105 ↔ 120 ↔ 121 ↔ 124 ↔ 125

	SCAN:	CPLF0		;Reset scan flag
		ORBI	SBITS	;Turn off rows
		ANBI	ROW0
		INP	1	;Scan row 0
		CPLA
		MOVAR	SW0	;Save it
		ANI	17	;Get low nibble
		MOVPD		;Get bits from spread table
		XCHR	SW0
		SWAP		;Swap high low nibbles
		ANI	17	;Get high nibble 
		MOVPD
		MOVAR	SW1

		ORBI	SBITS
		ANBI	ROW1
		INP	1	;Scan row 1
		ORBI	377	;Last ¬WR on bus
		CPLA
		MOVAR	SW2	;Save row 1
		ANI	17	;Low nibble
		MOVPD
		ROL		;Shift + bits
		ORR	SW0	;Or into - bits
		ANI	374	;Clear teach and off bits.
		MOVAR	SW0
		MOVRA	SW2	;Get row 1 again
		SWAP
		ANI	17
		MOVPD
		ROL
		ORR	SW1
		MOVAR	SW1
		INP	2	;Get push buttons
		CPLA
		MOVAR	SW2
		ROLC		;Shift & swap teach & off bits
		ROL
		ROLC
		ANI	3
		ORR	SW0
		MOVAR	SW0

		JMP	OSWTCH
   LOC 2272
		0	;This is for a block of zeros
END